package com.kexio.dynamic.permission.service;

import java.util.List;
import java.util.Map;

/**
 * 动态权限服务接口
 * 
 * 提供运行时动态权限管理功能
 * 
 * @author Kexio
 * @since 1.0.0
 */
public interface DynamicPermissionService {

    /**
     * 检查用户是否拥有指定权限
     *
     * @param userId 用户ID
     * @param permission 权限标识
     * @return 是否拥有权限
     */
    boolean hasPermission(Long userId, String permission);

    /**
     * 检查用户是否拥有任一权限
     *
     * @param userId 用户ID
     * @param permissions 权限标识列表
     * @return 是否拥有任一权限
     */
    boolean hasAnyPermission(Long userId, List<String> permissions);

    /**
     * 检查用户是否拥有所有权限
     *
     * @param userId 用户ID
     * @param permissions 权限标识列表
     * @return 是否拥有所有权限
     */
    boolean hasAllPermissions(Long userId, List<String> permissions);

    /**
     * 授予用户权限
     *
     * @param userId 用户ID
     * @param permission 权限标识
     */
    void grantPermission(Long userId, String permission);

    /**
     * 批量授予用户权限
     *
     * @param userId 用户ID
     * @param permissions 权限标识列表
     */
    void grantPermissions(Long userId, List<String> permissions);

    /**
     * 撤销用户权限
     *
     * @param userId 用户ID
     * @param permission 权限标识
     */
    void revokePermission(Long userId, String permission);

    /**
     * 批量撤销用户权限
     *
     * @param userId 用户ID
     * @param permissions 权限标识列表
     */
    void revokePermissions(Long userId, List<String> permissions);

    /**
     * 获取用户所有权限
     *
     * @param userId 用户ID
     * @return 权限标识列表
     */
    List<String> getUserPermissions(Long userId);

    /**
     * 授予角色权限
     *
     * @param roleId 角色ID
     * @param permission 权限标识
     */
    void grantRolePermission(Long roleId, String permission);

    /**
     * 撤销角色权限
     *
     * @param roleId 角色ID
     * @param permission 权限标识
     */
    void revokeRolePermission(Long roleId, String permission);

    /**
     * 获取角色所有权限
     *
     * @param roleId 角色ID
     * @return 权限标识列表
     */
    List<String> getRolePermissions(Long roleId);

    /**
     * 创建权限规则
     *
     * @param rule 权限规则
     */
    void createPermissionRule(PermissionRule rule);

    /**
     * 更新权限规则
     *
     * @param ruleId 规则ID
     * @param rule 权限规则
     */
    void updatePermissionRule(Long ruleId, PermissionRule rule);

    /**
     * 删除权限规则
     *
     * @param ruleId 规则ID
     */
    void deletePermissionRule(Long ruleId);

    /**
     * 获取权限规则
     *
     * @param ruleId 规则ID
     * @return 权限规则
     */
    PermissionRule getPermissionRule(Long ruleId);

    /**
     * 查询权限规则
     *
     * @param criteria 查询条件
     * @return 权限规则列表
     */
    List<PermissionRule> queryPermissionRules(Map<String, Object> criteria);

    /**
     * 验证权限表达式
     *
     * @param expression 权限表达式
     * @return 是否有效
     */
    boolean validatePermissionExpression(String expression);

    /**
     * 计算权限表达式
     *
     * @param userId 用户ID
     * @param expression 权限表达式
     * @return 计算结果
     */
    boolean evaluatePermissionExpression(Long userId, String expression);

    /**
     * 刷新用户权限缓存
     *
     * @param userId 用户ID
     */
    void refreshUserPermissionCache(Long userId);

    /**
     * 刷新角色权限缓存
     *
     * @param roleId 角色ID
     */
    void refreshRolePermissionCache(Long roleId);

    /**
     * 清理所有权限缓存
     */
    void clearAllPermissionCache();

    /**
     * 权限规则类
     */
    class PermissionRule {
        private Long id;
        private String name;
        private String description;
        private String expression;
        private String resourcePattern;
        private String action;
        private Integer priority;
        private Boolean enabled;
        private java.time.LocalDateTime createTime;
        private java.time.LocalDateTime updateTime;

        // 构造函数
        public PermissionRule() {}

        public PermissionRule(String name, String expression) {
            this.name = name;
            this.expression = expression;
        }

        // Getters and Setters
        public Long getId() { return id; }
        public void setId(Long id) { this.id = id; }

        public String getName() { return name; }
        public void setName(String name) { this.name = name; }

        public String getDescription() { return description; }
        public void setDescription(String description) { this.description = description; }

        public String getExpression() { return expression; }
        public void setExpression(String expression) { this.expression = expression; }

        public String getResourcePattern() { return resourcePattern; }
        public void setResourcePattern(String resourcePattern) { this.resourcePattern = resourcePattern; }

        public String getAction() { return action; }
        public void setAction(String action) { this.action = action; }

        public Integer getPriority() { return priority; }
        public void setPriority(Integer priority) { this.priority = priority; }

        public Boolean getEnabled() { return enabled; }
        public void setEnabled(Boolean enabled) { this.enabled = enabled; }

        public java.time.LocalDateTime getCreateTime() { return createTime; }
        public void setCreateTime(java.time.LocalDateTime createTime) { this.createTime = createTime; }

        public java.time.LocalDateTime getUpdateTime() { return updateTime; }
        public void setUpdateTime(java.time.LocalDateTime updateTime) { this.updateTime = updateTime; }
    }
}
